//
//  CQHomeTableViewController.swift
//  swift-weibo
//
//  Created by 陈乾 on 15/10/26.
//  Copyright © 2015年 陈乾. All rights reserved.
//

import UIKit
import SVProgressHUD
import MJRefresh

enum CQTabelViewCellID: String {

    case NormalCell = "NormalCell"
    case ForwardCell = "ForwardCell"
    
}


class CQHomeTableViewController: CQBasicTableViewController {
    
  
    //MARK: - 懒加载用来刷新动漫的图片
    lazy var imageArr: [UIImage] = {
        
        var imageArray = [UIImage]()
        for var i = 0; i<30; i++ {
            
         let imageName = String.localizedStringWithFormat("ico_imsm_loading_stonehenge_000%0.2d",i)
         let image = UIImage(named: imageName)
         imageArray.append(image!)
        }
        return imageArray
        
        }()
    
    
    
    //创建用来保存微博模型的数组
    var statusArray: [CQStatus]? {
        didSet{
            //当数据变化会来这 更新数据
            tableView.reloadData()
        }
        
    }
    //重用标识
//    let ID: String = "cell"
    
    //MARK: -viewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
        
       

        //没有登录就不往下面走了
        if !CQUserAccount.loginYN {
           return
        }
        //- 设置导航条 左右两边的按钮
        setNavigationItem()

        //设置tableview
        setTableView()
        
        //添加刷新控件
        self.refreshControl = CQRefreshControl()
        //添加下拉 事键 就会调用loadStatus()函数
        refreshControl?.addTarget(self, action: "loadStatus", forControlEvents: UIControlEvents.ValueChanged)
        //自动刷新加载微博数据 而不需要我们这样调 loadStatus()
        //但这样并不能自动loadStatus()触发 只会触发系统的刷新空间 进入刷新状态
        
        refreshControl?.beginRefreshing()
        //需要我们手动 触发 值的改变
        refreshControl?.sendActionsForControlEvents(UIControlEvents.ValueChanged)
        
        //尾部刷新 oc版
        // 设置回调（一旦进入刷新状态，就调用target的action，也就是调用self的loadMoreData方法）
        /*
        MJRefreshAutoGifFooter *footer = [MJRefreshAutoGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
        
        // 设置刷新图片
        [footer setImages:refreshingImages forState:MJRefreshStateRefreshing];
        
        // 设置尾部
        self.tableView.footer = footer;
        */
        
//      let footer = MJRefreshAutoGifFooter(refreshingTarget: self, refreshingAction: "loadStatus")
     
         //设置动画
        footer.setImages(imageArr, duration: 2, forState: MJRefreshStateRefreshing)
        self.tableView.footer = footer
        
        
        
        
    }
    
    //MARK: -获得网络微博数据
     func loadStatus()
    {
        //拿到最大id的数据传过去 就会返回更大的id的微博 即为最新微博
        var since_id = statusArray?.first?.id ?? 0
        var max_id = 0
         print(since_id)
        
        if footer.isRefreshing() {
            since_id = 0
            max_id = statusArray?.last?.id ?? 0
        }

        
         CQStatus.loadStauts(since_id, max_id: max_id) { (statusArr, error) -> () in
            
            //来这里 数据已经下载下来了  我们需要关闭旋转 因为我们重写了调用endRefreshing()就可以
            self.refreshControl?.endRefreshing()
            //TODO 关闭 上拉刷新的
            self.footer.endRefreshing()
            
            if error != nil
            {
                //弹框
                SVProgressHUD.showErrorWithStatus("网络不给力啊，微博数据加载失败", maskType: SVProgressHUDMaskType.Black)
                return
            }
            
            if statusArr?.count == 0 || statusArr == nil {
                SVProgressHUD.showInfoWithStatus("没有新的微博数据", maskType: SVProgressHUDMaskType.Black)
                return
                
            }
            //如果是下拉刷新 就添加这个提示view
            if since_id > 0 {
                
                let count = statusArr?.count ?? 0
                 self.tipView(count)
             }
            
            
            //来这说明数据有了 可以赋值给定义的微博数组
           
            //下拉刷新的新微博 
            if since_id > 0 {
            self.statusArray = statusArr! + self.statusArray!
            } else if max_id > 0 {
                
             self.statusArray = self.statusArray! + statusArr!
            }
            else {
             //第一次刷新回来的20条数据
            self.statusArray = statusArr
            }
        }
        
    }
    
    
    //MARK: - 更新微博的提示view
    func tipView(count: Int) {
      
      //创建一个label
        let label = UILabel()
        //label的高
        let height: CGFloat = 44
        //设置frame 先隐藏在屏幕外边 看不到
        label.frame = CGRectMake(0, -64, UIScreen.screenWidth(), height)
        
        //设置类容
        label.text = count == 0 ? "没有新的微博" : "加载了\(count)条新微博"
        
        //字体大小
        label.font = UIFont.systemFontOfSize(14)
        //背景
        label.backgroundColor = UIColor.orangeColor()
         //字体颜色
        label.textColor = UIColor.whiteColor()
        //把他label添加到导航条下面
        navigationController?.navigationBar.insertSubview(label, atIndex: 0)
      
        //执行动画
    UIView.animateWithDuration(1, animations: { () -> Void in
        
        //让动画反过来
        //UIView.setAnimationRepeatAutoreverses(true)
        //设置动画的执行次数
        //UIView.setAnimationRepeatCount(5)
        
        //显示在导航条下
        label.frame.origin.y = 44
        }) { (_) -> Void in
           UIView.animateWithDuration(1, animations: { () -> Void in
               //先隐藏在屏幕外边 看不到
               label.frame.origin.y = -64
            }, completion: { (_) -> Void in
              //移除
                label.removeFromSuperview()
           })
            
        }
 
    }
    
    
    //MARK: - 设置导航条 左右两边的按钮
    func setNavigationItem() {
    
        //设置首页导航栏左右两边的item
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch")
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop")
        //设置标题button
        //创建按钮
        let titleButton = CQHomeButton()
        //如果？？前面的有值就拆包赋值给buttonName 否者就把后面的赋值过去
        let buttonName = CQUserAccount.loadAccount()?.name ?? "没有值"
        
        titleButton.setTitle(buttonName, forState: UIControlState.Normal)
        titleButton.setTitleColor(UIColor.purpleColor(), forState: UIControlState.Normal)
        titleButton.setImage(UIImage(named: "navigationbar_arrow_down"), forState: UIControlState.Normal)
        titleButton.addTarget(self, action: "clickPop:", forControlEvents: UIControlEvents.TouchUpInside)
        titleButton.sizeToFit()
        self.navigationItem.titleView = titleButton

    
    
    }
    
    //MARK: - 设置的一些属性setTableView
    func setTableView() {
       
        //
        tableView.tableFooterView = pullUpView
        
        //注册原创cell
        tableView.registerClass(CQNomalCell.self, forCellReuseIdentifier: CQTabelViewCellID.NormalCell.rawValue)
        //注册转发微博cell
        tableView.registerClass(CQForwardCell.self, forCellReuseIdentifier: CQTabelViewCellID.ForwardCell.rawValue)
        
        //设置预估高度
        tableView.estimatedRowHeight = 300
        //自动设置尺寸
//        tableView.rowHeight = UITableViewAutomaticDimension
        //去掉分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        
    
    }
    
    //MARK: -titleButton按钮点击
    @objc private func clickPop(button: UIButton) {
        
        print("点击了按钮")
        //按钮反选
        button.selected = !button.selected
        //如果选中就旋转
        if button.selected {
            UIView.animateWithDuration(0.25, animations: { () -> Void in
                //默认顺时针转，旋转有就近原则
                button.imageView?.transform = CGAffineTransformMakeRotation(CGFloat(M_PI - 0.01))
            })
            
        }else{
            
            UIView.animateWithDuration(0.25, animations: { () -> Void in
                //还原角度
                button.imageView?.transform = CGAffineTransformIdentity
            })
        }
        
    }
    
   
    
    
    // MARK: - Table view data source
    
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //如果有值拆包赋值 没有就赋值0
        return self.statusArray?.count ?? 0
    }
    
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        //去模型
        let status = self.statusArray![indexPath.row]
        
        //模型提供重用ID
        let ID = status.getReuseableIdentifier()
        //去队列中取
        let cell = tableView.dequeueReusableCellWithIdentifier(ID) as! CQHomeTableViewCell
        
        //把模型传给cell 让cell 显示数据
        cell.status = status
        //判断如果是最后一个cell就 来上拉刷新
        if indexPath.row == statusArray!.count - 1 && pullUpView.isAnimating() {
          
          //让菊花转起来
            pullUpView.startAnimating()
            //调方法
        loadStatus()
        }
        
        
      
        //返回
        return cell
    }
    
    //MARK: - 返回cell的高度
    // dequeueReusableCellWithIdentifier(identifier: String, forIndexPath: NSIndexPath)
    //用上面的方法 会造成死循环 用下面写的则不会
    //每次都要计算每一个cell的高度 所有我们在微博模型里面添加了一个记录当前模型对应cell的高度的属性
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
    {
        //去模型
        let status = statusArray![indexPath.row]
        //判断模型里面有木有值
        if let rowHeight = status.rowHeightCache {
           //有缓存就返回
            return rowHeight
        }
        
        
        
        //去缓存队列获取cell
         let cell = tableView.dequeueReusableCellWithIdentifier(status.getReuseableIdentifier()) as! CQHomeTableViewCell
        //重写计算行高
        let height = cell.rowOfHeight(status)
        //保存到微博模型中
        status.rowHeightCache = height
        return height
        
    }
    
    //MARK: - 懒加载菊花
    private lazy var pullUpView: UIActivityIndicatorView = {
        
        //创建菊花
        let juhua = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.White)
        
        juhua.color = UIColor.redColor()
        
        
        return juhua
        }()
    
    private lazy var footer: MJRefreshAutoGifFooter = MJRefreshAutoGifFooter(refreshingTarget: self, refreshingAction: "loadStatus")
    
/**************/
}
